<?php
namespace App\Repositories;
use App\Exceptions\OrdinaryException;
use Illuminate\Database\Eloquent\Model;

/**
 * interface RepositoryContract
 * @package App\Repository
 * @date 2018-11-12
 * @author zx
 */
interface RepositoryContract{

    /**
     * 获取所有资源集合
     *
     * @date 2018-11-12
     * @author zx
     * @param array $columns
     * @return \Illuminate\Database\Eloquent\Collection|static[]
     */
    public function all(array $columns = ["*"]);

    /**
     * 获取资源汇总
     *
     * @date 2018-11-12
     * @author zx
     * @return int
     */
    public function count();

    /**
     * 创建资源
     *
     * @author zx
     * @date 2018-11-12
     * @param array $data
     * @return mixed
     */
    public function create(array $data);

    /**
     * 创建多个资源
     *
     * @date 2018-11-12
     * @author zx
     * @param array $data
     * @return mixed
     */
    public function createMultiple(array $data);

    /**
     * 销毁指定的模型资源
     *
     * @date 2018-11-12
     * @author zx
     * @param Model $model 模型类
     * @param bool $force
     * @return bool|null
     * @throws OrdinaryException
     */
    public function destroy(Model $model, bool $force=FALSE);

    /**
     * 根据查询条件,批量删除资源
     *
     * @date 2018-11-12
     * @author zx
     * @return mixed
     */
    public function delete();

    /**
     * 根据主键删除资源
     *
     * @date 2018-11-12
     * @author zx
     * @param $primary 主键
     * @return mixed
     */
    public function deleteByPrimary($primary);

    /**
     * 根据多个主键,删除对应资源
     *
     * @date 2018-11-12
     * @author zx
     * @param array $ids
     * @return mixed
     */
    public function deleteMultipleByPrimary(array $ids);

    /**
     * 获取第一个资源
     *
     * @date 2018-11-12
     * @author zx
     * @param array $columns
     * @return mixed
     */
    public function first(array $columns=["*"]);

    /**
     * 获取资源集合
     *
     * @date 2018-11-12
     * @author zx
     * @param array $columns
     * @return mixed
     */
    public function get(array $columns=["*"]);

    /**
     * 根据主键获取资源
     *
     * @date 2018-11-12
     * @author zx
     * @param $primary 主键
     * @param array $columns
     * @return mixed
     */
    public function getByPrimary($primary, array $columns=["*"]);

    /**
     * 获取指定列
     *
     * @date 2018-11-12
     * @author zx
     * @param $item
     * @param $column
     * @param array $columns
     * @return mixed
     */
    public function getByColumn($item, $column, array $columns=["*"]);

    /**
     * 设置分页
     *
     * @date 2018-11-12
     * @author zx
     * @param int $limit 条数
     * @param array $columns
     * @param string $pageName
     * @param null $page
     * @return mixed
     */
    public function paginate(int $limit=25, array $columns=["*"], string $pageName='page', $page=NULL);

    /**
     * 根据主键更新资源
     *
     * @date 2018-11-12
     * @author zx
     * @param $primary
     * @param array $data
     * @param array $options
     * @return mixed
     */
    public function updateByPrimary($primary, array $data, array $options=[]);

    /**
     * 设置查询条目数
     *
     * @date 2018-11-12
     * @author zx
     * @param int $limit
     * @return mixed
     */
    public function limit(int $limit);

    /**
     * 设置查询排序
     *
     * @date 2018-11-12
     * @author zx
     * @param string $column
     * @param string $value
     * @return mixed
     */
    public function orderBy(string $column, string $value);

    /**
     * 设置查询条件
     *
     * @date 2018-11-12
     * @author zx
     * @param $column
     * @param $value
     * @param $operator
     * @return mixed
     */
    public function where($column, $value, string $operator="=");

    /**
     * 设置whereIn查询条件
     *
     * @date 2018-11-12
     * @author zx
     * @param $column
     * @param $value
     * @return mixed
     */
    public function whereIn($column, $value);

    /**
     * 设置关联关系懒加载
     *
     * @author zx
     * @date 2018-11-12
     * @param $relations
     * @return $mixed
     */
    public function with($relations);
}